﻿#ifndef MVS_H
#define MVS_H

#include <QString>
#include <opencv2/opencv.hpp>

#include "fsConfig.h"
#include "tool.h"
#include "define.h"

//海康机器人工业相机-类函数接口
#include "MvCameraControl.h"

#ifndef MV_NULL
#define MV_NULL    0
#endif

typedef struct _MVS_FRAME_OUT{
    int     Width;          //图像宽
    int     Height;         //图像高
    int     ImageFormat;    //图像格式
    int     FrameNum;       //帧号
    int     FrameByteLen;   //帧数据包字节长度
    int     ErrorNums;
    int     LostNums;
    int     FrameCounter;   //总帧数
    int     TriggerIndex;   //触发计数
    int64_t TimeStamp;      //时间戳(ms)
}MVS_FRAME_OUT;

typedef struct _MVS_EVENT_OUT{
    int64   BlockId;
    int64_t TimeStamp;      //时间戳(ms)
}MVS_EVENT_OUT;

int getImageFormat(int typeValue);

class MVS
{
public:
    MVS(fsConfig *conf);
    ~MVS();

    qint64  curFrameEncodeTimer;
    int     curFrameEncodeCounter;

    bool isDev(void);
    bool isOpen(void);
    bool isGrabbing(void);
    void Init(void);
    //获取SDK版本信息
    QString getSDKVersion(void);
    //SDK初始化
    void sdkInit(void);
    //SDK释放
    void sdkFinal(void);
    //获取设备名称
    QString getDeviceName(void);
    QString getMvsInfo(void);
    void getUptime(void);
    //枚举相机设备列表
    static int EnumDevices(MV_CC_DEVICE_INFO_LIST* pstDevList);
    //判断设备是否可达
    static bool IsDeviceAccessible(MV_CC_DEVICE_INFO* pstDevInfo, unsigned int nAccessMode);
    // 打开相机
    int openCamera(void);
    //关闭相机
    void closeCamera(void);
    // 判断相机是否处于连接状态
    bool IsDeviceConnected();
    // 采集帧率
    void getResulting(void);
    // void getFrameRate(float &rate);
    // void setFrameTime(int64_t stamp);
    // 注册图像数据回调
    bool RegisterImageCallBack(void(__stdcall* cbOutput)(unsigned char * pData, MV_FRAME_OUT_INFO_EX* pFrameInfo, void* pUser), void* pUser);
    // 注册事件回调
    bool AddEvent(void);
    bool RegisterEventCallBack(void(__stdcall* cbOutput)(MV_EVENT_OUT_INFO* pEventInfo, void* pUser), void* pUser);
    //开启相机采集
    bool startGrabbing(void);
    //停止相机采集
    void stopGrabbing(void);
    //设置心跳时间
    int setHeartBeatTime(unsigned int time);
    //显示窗口
    // int DisplayOneFrame(MV_DISPLAY_FRAME_INFO* pDisplayInfo);
    //转换图像
    // int convertPixelType(MV_CC_PIXEL_CONVERT_PARAM *param);
    //获取和设置参数
    int GetIntValue(IN const char* strKey, OUT MVCC_INTVALUE_EX *pIntValue);
    int SetIntValue(IN const char* strKey, IN int64_t nValue);
    int GetEnumValue(IN const char* strKey, OUT MVCC_ENUMVALUE *pEnumValue);
    int SetEnumValue(IN const char* strKey, IN unsigned int nValue);
    int SetEnumValueByString(IN const char* strKey, IN const char* sValue);
    int GetEnumEntrySymbolic(IN const char* strKey, IN MVCC_ENUMENTRY* pstEnumEntry);
    int GetFloatValue(IN const char* strKey, OUT MVCC_FLOATVALUE *pFloatValue);
    int SetFloatValue(IN const char* strKey, IN float fValue);
    int GetBoolValue(IN const char* strKey, OUT bool *pbValue);
    int SetBoolValue(IN const char* strKey, IN bool bValue);
    int GetStringValue(IN const char* strKey, MVCC_STRINGVALUE *pStringValue);
    int SetStringValue(IN const char* strKey, IN const char * strValue);
    int SetCommand(IN const char* strKey);
    // 获取所有参数
    void getParms(void);

    // 参数:获取/设置曝光时间
    bool getExposureTime(float &nValue,float &nMin,float &nMax);
    bool setExposureTime(float ExposureTime);
    // 图像宽度/高度
    bool getWidth(void);
    bool setWidth(int width);
    bool getHeight(void);
    bool setHeight(int height);
    //行频
    bool getLineRate(void);
    bool setLineRate(int rate);
    bool getLineRateEnable(void);
    bool setLineRateEnable(bool enable);
    //设置相机触发模式
    bool setTriggerMode(bool enable);
    //分频调节
    bool setPreDivider(int value);
    bool setMultiplier(int value);
    bool setPostDivider(int value);
    //编码
    bool getEncode(void);
    bool isEncodeOver(int timer);
    //保存缺省参数
    bool savePara(void);
    // 参数:获取/设置色度
    // int getHue(int &nValue,int &nMin,int &nMax);
    // bool setHue(int hue);
    // 参数:获取/设置亮度
    // int getBrightness(int &nValue,int &nMin,int &nMax);
    // bool setBrightness(int brightness);
    // 参数:获取/设置饱和度
    // int getSaturation(int &nValue,int &nMin,int &nMax);
    // bool setSaturation(int saturation);
    // 参数:获取/设置伽马
    // int getGamma(int &nValue,int &nMin,int &nMax);
    // bool setGamma(int gamma);

    void setImage(void);

    bool IsColor(MvGvspPixelType enType);
    bool IsMono(MvGvspPixelType enType);

    bool setImageFormat(int nValue);

//    bool setHorizontal(int nValue);
//    void getHorizontal(int &nValue);
    void setPara(const int nums,const int errs,const int losts);

    PARAMS_VAR getPara(void);
    bool isError(void);
    QString getError(void);
private:
    void* m_hDevHandle;
    //设备信息：厂商，型号，序列号，设备版本
    int devType;
    QString typeInfo;
    QString factoryName;
    QString modelInfo;
    QString serialInfo;
    QString deviceVer;
    // 是否初始化
    bool isSdkInit;
    // 是否打开设备
    bool isOpenDevice;
    // 是否开始采集
    bool isStartGrabbing;
    qint64  curEncodeTimer;
    int     curEncodeCounter;
    // 生成时间戳
    bool isFrameCallback;
    bool isEventCallback;
    // 用于保存图像的缓存
    // unsigned char* m_pBufForSaveImage;
    // unsigned int m_nBufSizeForSaveImage;
    // 用于从驱动获取图像的缓存
    // unsigned char* m_pBufForDriver;
    // unsigned int m_nBufSizeForDriver;
    // 设备信息列表结构体变量，用来存储设备列表
    MV_CC_DEVICE_INFO_LIST m_stDevList;
    // 设备对象
    MV_CC_DEVICE_INFO *m_Device;
    //参数
    PARAMS_VAR  m_ParasInfo;
    fsConfig *fsConf;

    int errRet;
    void saveErrorMsg(const QString msg);
};

#endif // MVS_H
